﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using PontoDeVenda.Web;

namespace Dals
{
    public class PedidoDal
    {
        string connString = "Data Source=.;Initial Catalog=PontaVenda;Integrated Security=True";

        SqlConnection conn;

        public PedidoDal()
        {
            conn = new SqlConnection(connString);
        }

        public Pedido SelectPedidoPorId(int id)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = "SELECT * FROM Pedido WHERE pedidoID = " + id;

            SqlCommand cmd = new SqlCommand(sql, conn);

            SqlDataReader reader = cmd.ExecuteReader();

            Pedido pedido = null;

            while (reader.Read())
            {
                pedido = new Pedido();

                pedido.pedidoID = Convert.ToInt32(reader["pedidoID"]);
                pedido.data = Convert.ToDateTime(reader["data"]);
                pedido.valor = Convert.ToDecimal(reader["valor"]);
                pedido.clienteID = Convert.ToInt32(reader["clienteID"]);

                DataClasseClienteDataContext db = new DataClasseClienteDataContext();
                pedido.Cliente = db.LocalizarClientePorID(pedido.clienteID).First();
            }

            reader.Close();

            if (pedido == null)
                return pedido;

            sql = "SELECT * FROM ItensPedido WHERE pedidoID = " + id;

            cmd = new SqlCommand(sql, conn);

            reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                ItensPedido item = new ItensPedido();

                item.itemNum = Convert.ToInt32(reader["itemNum"]);
                item.qtdade = Convert.ToInt32(reader["qtdade"]);
                item.precoVenda = Convert.ToDecimal(reader["precoVenda"]);
                item.pedidoID = Convert.ToInt32(reader["pedidoID"]);
                item.produtoID = Convert.ToInt32(reader["produtoID"]);

                DataClasseClienteDataContext db = new DataClasseClienteDataContext();
                item.Produto = db.LocalizarProdutoPorID(item.produtoID).First();

                pedido.ItensPedidos.Add(item);
            }

            conn.Close();

            return pedido;
        }

        public List<Cliente> SelectClientes()
        {
            List<Cliente> clientes = new List<Cliente>();

            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = "SELECT * FROM Cliente";

            SqlCommand cmd = new SqlCommand(sql, conn);

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                Cliente cliente = new Cliente();

                cliente.clienteID = Convert.ToInt32(reader["clienteID"]);
                cliente.nome = Convert.ToString(reader["nome"]);
                cliente.sexo = Convert.ToChar(reader["sexo"]);
                cliente.email = Convert.ToString(reader["email"]);

                clientes.Add(cliente);
            }

            conn.Close();

            return clientes;
        }

        public List<Produto> SelectProdutos()
        {
            List<Produto> produtos = new List<Produto>();

            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = "SELECT * FROM Produto";

            SqlCommand cmd = new SqlCommand(sql, conn);

            SqlDataReader reader = cmd.ExecuteReader();

            while (reader.Read())
            {
                Produto produto = new Produto();

                produto.produtoID = Convert.ToInt32(reader["produtoID"]);
                produto.descricao = Convert.ToString(reader["descricao"]);
                produto.precoUnitario = Convert.ToDecimal(reader["precoUnitario"]);

                produtos.Add(produto);
            }

            conn.Close();

            return produtos;
        }

        public void InserirPedido(Pedido pedido)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = @"INSERT INTO Pedido
                        (pedidoID, data, valor, clienteID)
                            VALUES
                        (@pedidoID, @data, @valor, @clienteID)";

            SqlCommand cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("pedidoID", pedido.pedidoID);
            cmd.Parameters.AddWithValue("data", pedido.data);
            cmd.Parameters.AddWithValue("valor", pedido.valor);
            cmd.Parameters.AddWithValue("clienteID", pedido.clienteID);

            cmd.ExecuteNonQuery();

            sql = @"INSERT INTO ItensPedido
                    (itemNum, qtdade, precoVenda, pedidoID, produtoID)
                        VALUES
                    (@itemNum, @qtdade, @precoVenda, @pedidoID, @produtoID)";

            cmd = new SqlCommand(sql, conn);

            foreach (ItensPedido item in pedido.ItensPedidos)
            {
                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("itemNum", item.itemNum);
                cmd.Parameters.AddWithValue("qtdade", item.qtdade);
                cmd.Parameters.AddWithValue("precoVenda", item.precoVenda);
                cmd.Parameters.AddWithValue("pedidoID", item.pedidoID);
                cmd.Parameters.AddWithValue("ProdutoID", item.produtoID);

                cmd.ExecuteNonQuery();
            }

            conn.Close();
        }

        public void DeletarPedido(int id)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = @"DELETE FROM ItensPedido 
                        WHERE pedidoID=@pedidoID";

            SqlCommand cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("pedidoID", id);

            cmd.ExecuteNonQuery();

            sql = @"DELETE FROM Pedido 
                        WHERE pedidoID=@pedidoID";

            cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("pedidoID", id);

            cmd.ExecuteNonQuery();
        }

        public void AtualizarPedido(Pedido pedido)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = @"UPDATE Pedido SET 
                        data=@data, valor=valor, clienteID = @clienteID 
                        WHERE pedidoID=@pedidoID";

            SqlCommand cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("pedidoID", pedido.pedidoID);
            cmd.Parameters.AddWithValue("data", pedido.data);
            cmd.Parameters.AddWithValue("valor", pedido.valor);
            cmd.Parameters.AddWithValue("clienteID", pedido.clienteID);

            cmd.ExecuteNonQuery();

            string sqlInsert = @"INSERT INTO ItensPedido
                    (itemNum, qtdade, precoVenda, pedidoID, produtoID)
                        VALUES
                    (@itemNum, @qtdade, @precoVenda, @pedidoID, @produtoID)";

            string sqlUpdate = @"UPDATE ItensPedido SET 
                                qtdade=@qtdade, precoVenda=@precoVenda, produtoID=@produtoID 
                                WHERE itemNum=@itemNum AND pedidoID=@pedidoID";

            foreach (ItensPedido item in pedido.ItensPedidos)
            {
                if (existeItem(item))
                    cmd = new SqlCommand(sqlUpdate, conn);
                else
                    cmd = new SqlCommand(sqlInsert, conn);

                cmd.Parameters.Clear();
                cmd.Parameters.AddWithValue("itemNum", item.itemNum);
                cmd.Parameters.AddWithValue("qtdade", item.qtdade);
                cmd.Parameters.AddWithValue("precoVenda", item.precoVenda);
                cmd.Parameters.AddWithValue("pedidoID", item.pedidoID);
                cmd.Parameters.AddWithValue("ProdutoID", item.produtoID);

                cmd.ExecuteNonQuery();
            }
        }

        private bool existeItem(ItensPedido item)
        {
            if (conn.State != ConnectionState.Open)
                conn.Open();

            string sql = @"SELECT COUNT(*) FROM ItensPedido 
                        WHERE itemNum=@itemNum AND pedidoID=@pedidoID";

            SqlCommand cmd = new SqlCommand(sql, conn);

            cmd.Parameters.AddWithValue("itemNum", item.itemNum);
            cmd.Parameters.AddWithValue("pedidoID", item.pedidoID);

            int count = Convert.ToInt32(cmd.ExecuteScalar());

            return count > 0;
        }
    }
}